专业的综合支付与信息服务提供商,提供丰富的支付+行业解决方案,满足各合作伙伴对支付服务的多样场景化需求。
声明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。
该代码仅供参考,不提供编码,性能,规范性等方面的保障
签名规则
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数
生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读 public static void gzh() throws UnsupportedEncodingException { TreeMap treeMap = new TreeMap(); treeMap.put("version", "20191031"); treeMap.put("msgId", "4217"); treeMap.put("msgType", ""); treeMap.put("requestTimestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); treeMap.put("expireTime", ""); treeMap.put("merOrderId", "4217" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())); treeMap.put("mid", mid); treeMap.put("tid",tid); treeMap.put("instMid", "YUEDANDEFAULT"); treeMap.put("attachedData",""); treeMap.put("orderDesc",""); treeMap.put("originalAmount", ""); treeMap.put("totalAmount", "1"); treeMap.put("notifyUrl", "http://ip:port/server/notify"); treeMap.put("signType", "SHA256"); treeMap.put("extend1","extend1"); treeMap.put("extend2","extend2"); treeMap.put("extend3","extend3"); treeMap.put("extend4","extend4"); StringBuffer sb = new StringBuffer();// 代签名的字符串 StringBuffer req = new StringBuffer();// 组织请求参数 for (String key : treeMap.keySet()) { if (treeMap.get(key) != null && !"".equals(treeMap.get(key))) { if (sb.length() == 0) { sb.append(key + "=" + treeMap.get(key)); req.append(key + "=" + URLEncoder.encode(treeMap.get(key), "UTF-8")); } else { sb.append("&" + key + "=" + treeMap.get(key)); req.append("&" + key + "=" + URLEncoder.encode(treeMap.get(key), "UTF-8")); } } } System.out.println("待签名的字符串是:" + sb.toString()); String sign = ""; try { sign = SM3Util.SHA256(sb.toString() + signKey); } catch (Exception e) { } System.out.println("sign的值是:" + sign); req.append("&sign=" + URLEncoder.encode(sign, "UTF-8"));// 将签名信息添加在请求参数后面 System.out.println("公众号支付实际跳转的URL是:" + pay_url + req.toString()); }
同步响应一般是服务器端对接时,向大华捷通系统发起交易查询、退款请求、退款状态查询,关闭订单等交易时,大华捷通系统同步返回的json格式的数据,商户收到响应后,建议对签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数
生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
/** * String ret=demo.HttpGet.get(query_url);//发起http请求,此处用查询支付结果接口举例 * @param data JSONObject retJson=JSONObject.fromObject(ret);//将json字符串转成json对象 * @param sign String sign=retJson.optString("sign");//获取大华捷通应答的签名信息 * @return 根据上面的参数调用验签方法,返回延签是否通过 */ public static boolean checkSign(JSONObject data,String sign){ //1.遍历返回的json数据,将参数值非空的放入TreeMap集合 TreeMapmap = new TreeMap (); for (Object key : data.keySet()) { String value = data.optString((String) key); if(value!=null &&!"".equals(value) && !"sign".equals(key)){ map.put((String) key, value); } } //2.TreeMap集合会自动按key进行排序,遍历map,组织签名字符串 StringBuffer buffer=new StringBuffer(); for(String key:map.keySet()){ if(buffer.length()==0){ buffer.append(key+"="+map.get(key)); }else{ buffer.append("&"+key+"="+map.get(key)); } } //3.将拼接好的字符串+秘钥进行签名,此处使用SHA256 String localMac = SM3Util.SHA256(buffer.toString()+signKey); System.out.println("本地计算的mac:"+localMac); //4.对比签名是否一致 if(sign.equalsIgnoreCase(localMac)){ System.out.println("验签通过"); return true; }else{ System.out.println("验签失败"); } return false; }
同步跳转到商户系统,是基于浏览器跳转的,如:扫码支付,公众号支付,h5支付,网银等支付交易并且下单时传入了returnUrl参数时,才会存在,并且跳转的地址也是returnUrl参数值上,商户再收到同步跳转的请求时,需要获取所有的参数信息,根据errCode取值判断同步跳转回来的原因,如果errCode是SUCCESS,则需要根据status支付状态进行下一步业务处理,展示出相应的页面给付款人。商户收到响应后,建议对签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.获取全部的请求参数中,除去sign和空值的参数外,其他的参数均为要签名的参数
生成待签名字符串
第一步:设所有接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
private void returnMethod(HttpServletRequest request, HttpServletResponse response) { logger.info("*********************************支付return方法执行**********************************"); try { logger.info("************支付结果同步返回的参数信息开始************"); TreeMaptm = new TreeMap (); Enumeration requestNames = request.getParameterNames(); while(requestNames.hasMoreElements()){ String key = requestNames.nextElement(); String value = request.getParameter(key); tm.put(key, URLDecoder.decode(value, "UTF-8")); logger.info(key+":"+URLDecoder.decode(value, "UTF-8")); } logger.info("************支付结果同步返回的参数信息结束************"); Set keySet = tm.keySet(); StringBuffer signStr=new StringBuffer(); Iterator iter = keySet.iterator(); while (iter.hasNext()) { String key = iter.next(); if (tm.get(key) != null && !"".equals(tm.get(key))) { if(signStr.length()==0){signStr.append(key + "=" + tm.get(key));}else{signStr.append("&"+key + "=" + tm.get(key));} } } logger.info("待验签的字符串:",signStr.toString()); String signKey="1111111111111111111111111111111111111111111111111111111111111111"; String localSign=""; try { localSign = SM3Util.getSHA256(signStr.toString()+signKey); } catch (Exception e) { } logger.info("本地签名的值是:",localSign); //然后与大华捷通响应的sign进行对比,此处需要忽略大小写 if(localSign.equalsIgnoreCase(tm.get("sign"))){ logger.info("验签通过"); }else{ logger.info("验签不通过"); } //取出errCode和status的参数值 String errCode=tm.get("errCode")==null?"":tm.get("errCode"); String status=tm.get("status")==null?"":tm.get("status"); if("SUCCESS".equest(errCode)){ if("TRADE_SUCCESS".equest(status)){ //支付成功,跳转到支付成功页面,此处建议在调用一次查询接口,确认支付状态 }else{ //支付失败,跳转到支付失败页面,此处建议在调用一次查询接口,确认支付状态 } }else{ //支付请求失败,失败原因在errMsg上,取出来提示给付款人 } } catch (Exception e) { logger.info("同步返回异常:",e); //是否需要跳转异常页面,商户自行处理 } }
异步推送是服务器端对接时,支付完成后,大华捷通服务器收到渠道方返回的支付通知后,会进行通知给商户,商户收到响应后,需要在超时时间内做出应答,大华捷通再未收到应答或者应答不是SUCCESS时,会多次进行推送,商户需要做好同一个订单可能会推送多次情况的处理, 异步推送签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数
生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
private void returnMethod(HttpServletRequest request, HttpServletResponse response) { logger.info("*********************************支付return方法执行**********************************"); try { logger.info("************支付结果同步返回的参数信息开始************"); TreeMaptm = new TreeMap (); Enumeration requestNames = request.getParameterNames(); while(requestNames.hasMoreElements()){ String key = requestNames.nextElement(); String value = request.getParameter(key); tm.put(key, URLDecoder.decode(value, "UTF-8")); logger.info(key+":"+URLDecoder.decode(value, "UTF-8")); } logger.info("************支付结果同步返回的参数信息结束************"); Set keySet = tm.keySet(); StringBuffer signStr=new StringBuffer(); Iterator iter = keySet.iterator(); while (iter.hasNext()) { String key = iter.next(); if(signStr.length()==0){signStr.append(key + "=" + tm.get(key));}else{signStr.append("&"+key + "=" + tm.get(key));} } logger.info("待验签的字符串:",signStr.toString()); String signKey="1111111111111111111111111111111111111111111111111111111111111111"; String localSign=""; try { localSign = SM3Util.getSHA256(signStr.toString()+signKey); } catch (Exception e) { } logger.info("本地签名的值是:",localSign); //然后与大华捷通响应的sign进行对比,此处需要忽略大小写 if(localSign.equalsIgnoreCase(tm.get("sign"))){ logger.info("验签通过"); }else{ logger.info("验签不通过"); } } catch (Exception e) { logger.info("同步返回异常:",e); } }
签名规则
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数
生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
同步响应一般是服务器端对接时,向大华捷通系统发起交易查询、退款请求、退款状态查询,关闭订单等交易时,大华捷通系统同步返回的json格式的数据,商户收到响应后,建议对签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数
生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
同步跳转到商户系统,是基于浏览器跳转的,如:扫码支付,公众号支付,h5支付,网银等支付交易并且下单时传入了returnUrl参数时,才会存在,并且跳转的地址也是returnUrl参数值上,商户再收到同步跳转的请求时,需要获取所有的参数信息,根据errCode取值判断同步跳转回来的原因,如果errCode是SUCCESS,则需要根据status支付状态进行下一步业务处理,展示出相应的页面给付款人。商户收到响应后,建议对签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.获取全部的请求参数中,除去sign和空值的参数外,其他的参数均为要签名的参数
生成待签名字符串
第一步:设所有接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
异步推送是服务器端对接时,支付完成后,大华捷通服务器收到渠道方返回的支付通知后,会进行通知给商户,商户收到响应后,需要在超时时间内做出应答,大华捷通再未收到应答或者应答不是SUCCESS时,会多次进行推送,商户需要做好同一个订单可能会推送多次情况的处理, 异步推送签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数
生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
签名规则
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数
生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
同步响应一般是服务器端对接时,向大华捷通系统发起交易查询、退款请求、退款状态查询,关闭订单等交易时,大华捷通系统同步返回的json格式的数据,商户收到响应后,建议对签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数
生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
同步跳转到商户系统,是基于浏览器跳转的,如:扫码支付,公众号支付,h5支付,网银等支付交易并且下单时传入了returnUrl参数时,才会存在,并且跳转的地址也是returnUrl参数值上,商户再收到同步跳转的请求时,需要获取所有的参数信息,根据errCode取值判断同步跳转回来的原因,如果errCode是SUCCESS,则需要根据status支付状态进行下一步业务处理,展示出相应的页面给付款人。商户收到响应后,建议对签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.获取全部的请求参数中,除去sign和空值的参数外,其他的参数均为要签名的参数
生成待签名字符串
第一步:设所有接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
异步推送是服务器端对接时,支付完成后,大华捷通服务器收到渠道方返回的支付通知后,会进行通知给商户,商户收到响应后,需要在超时时间内做出应答,大华捷通再未收到应答或者应答不是SUCCESS时,会多次进行推送,商户需要做好同一个订单可能会推送多次情况的处理, 异步推送签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数
生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
公众号支付需要在手机微信支付宝云闪付app内运行,如果你是通过微信支付宝云闪付app阅读此文档,就可以直接点击下面支付按钮进行支付
如果你是在PC端阅读此文档,你可以将下面表单中的 支付url复制到微信支付宝聊天界面,在微信 支付宝中 点击链接完成支付
你也可以使用微信支付宝云闪付app扫码下方支付二维码,完成支付体验
//监听左侧表单[组织请求URL]按钮,获取输入框的参数值 form.on('submit(getRequestUrl)', function(data){ //固定常量值 var versionValue="20191031"; var msgIdValue="4217"; var instMidValue="MINIDEFAULT"; var signTypeValue="SHA256"; //获取支付参数 var merOrderIdValue=data.field.merOrderId; var midValue=data.field.mid; var tidValue=data.field.tid; var totalAmountValue=data.field.totalAmount; var orderDescValue=data.field.orderDesc; var notifyUrlValue=data.field.notifyUrl; var returnUrlValue=data.field.returnUrl; var requestTimestampValue=data.field.requestTimestamp; //这个参数是签名使用 var signkey=data.field.signkey; //支付的接口地址 var requestUrl="https://dhjt-uat.chinaums.com/queryService/UmsWebPayPlugins?"; //申明一个map集合,将所有参数和参数值放入map中,这个集合就是要发送到大华捷通支付接口的所有数据 var myMap = { instMid:instMidValue, signType:signTypeValue, version:versionValue, msgId:msgIdValue, merOrderId:merOrderIdValue, mid:midValue, tid:tidValue, totalAmount:totalAmountValue, orderDesc:orderDescValue, notifyUrl:notifyUrlValue, requestTimestamp:requestTimestampValue, returnUrl:returnUrlValue }; //申明一个数组,遍历map将key放入数组进行排序 var arr = new Array(); for(var key in myMap){ console.log("属性:" + key + ",值:" + myMap[key]); arr.push(key); } console.log("排序前:"+arr); arr.sort(); console.log("排序后:"+arr); var signStr="";//待签名的字符串 var reqStr="";//发送请求的url var len = arr.length for(var i = 0; i < len; i++) { if(myMap[arr[i]]!=undefined && myMap[arr[i]]!=""){ if(signStr==""){ signStr+=arr[i]+"="+myMap[arr[i]]; reqStr+=arr[i]+"="+encodeURIComponent(myMap[arr[i]]); }else{ signStr+="&"+arr[i]+"="+myMap[arr[i]]; reqStr+="&"+arr[i]+"="+encodeURIComponent(myMap[arr[i]]); } } } var signValue=layui.sha256(signStr+signkey).toUpperCase(); console.log("待签名字符串:"+signStr+signkey+"\n\nSHA256结果是:"+signValue); console.log("最终请求大华捷通的URL:"+requestUrl+reqStr+"&sign="+encodeURIComponent(signValue)); });